package modifyx

import (
	"gitee.com/zhongguo168a/gocodes/datax"
	"gitee.com/zhongguo168a/gocodes/datax/mapx"
)

type M = map[string]interface{}
type A = []interface{}

// className = origin["_type"]
func NewSource() *Source {
	return NewSourceWith(datax.M{})
}

func NewSourceWith(origin datax.M) *Source {
	return &Source{
		origin:    origin,
		className: mapx.String(origin, "_type"),
	}
}

// 数据源
// 通常加载后，数据源不可变，作为配置文件的映射
// 采用数据源的目的是为了避免数据的克隆影响性能，毕竟需要修正的地方有限
type Source struct {
	// 数据
	origin map[string]interface{}
	//
	id string
	//
	kind string
	// 作为结构时的类名
	className string

	// 保证一个root对象唯一, 需要传递给新的对象
	pools *PoolList
}

func (s *Source) GetPools() *PoolList {
	if s.pools == nil {
		s.pools = NewPoolList()
	}

	return s.pools
}

func (s *Source) ClassId() string {
	return s.id
}
func (s *Source) SetClassId(val string) {
	s.id = val
}
func (s *Source) ClassKey() string {
	return s.kind + "/" + s.id
}

func (s *Source) ClassKind() string {
	return s.kind
}

func (s *Source) ClassName() string {
	return s.className
}

func (s *Source) Dispose() {
	s.origin = nil
}

func (s *Source) Clone() (r *Source) {
	r = NewSourceWith(mapx.CloneMap(s.origin))
	return
}
